﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Data;
using Modelo;



namespace Business.Classes
{
    public class MaterialBO
    {
        BDCampus2Entities db = new BDCampus2Entities();

        /// <summary>
        /// Insere ou Edita um Material
        /// </summary>
        /// <param name="objMatVO">MaterialVO</param>
        /// <returns>int IdAnimal</returns>
        public int InserirOuEditar(MaterialVO objMatVO)
        {
            Material n = (from o in db.Materials
                          where o.ID_MATERIAL.Equals(objMatVO.IdMaterial)
                          select o).FirstOrDefault();


            if (n != null)
            {
                n.ID_TIPO_MATERIAL = objMatVO.IdTipoMaterial;
                n.DSC_MATERIAL = objMatVO.Descicao;
                n.MIN_ESTOQUE = objMatVO.MinEstoque;
                n.MAX_ESTOQUE = objMatVO.MaxEstoque;
                n.ID_FORNECEDOR = objMatVO.IdFornecedor;
                n.ID_USUARIO = objMatVO.IdUsuario;
                n.ID_UNIDADE_MEDIDA = objMatVO.IdUnidadeMedida;
                n.OBSERVACAO = objMatVO.Observacao;
                n.DAT_ALTERACAO = DateTime.Now;
                n.FLG_UTILIZADO = objMatVO.Utilizado;
                db.Materials.ApplyCurrentValues(n);
                db.SaveChanges();
            }
            else
            {
                n = new Material();
                n.ID_TIPO_MATERIAL = objMatVO.IdTipoMaterial;
                n.DSC_MATERIAL = objMatVO.Descicao;
                n.MIN_ESTOQUE = objMatVO.MinEstoque;
                n.MAX_ESTOQUE = objMatVO.MaxEstoque;
                n.ID_FORNECEDOR = objMatVO.IdFornecedor;
                n.ID_USUARIO = objMatVO.IdUsuario;
                n.ID_UNIDADE_MEDIDA = objMatVO.IdUnidadeMedida;
                n.OBSERVACAO = objMatVO.Observacao;
                n.DAT_CADASTRO = DateTime.Now;
                n.FLG_UTILIZADO = false;
                db.AddToMaterials(n);
                db.SaveChanges();
            }

            return n.ID_MATERIAL;
        }

        /// <summary>
        /// Seleciona um Material
        /// </summary>
        /// <param name="idMaterial">MaterialVO</param>
        /// <returns>int IdAnimal</returns>
        public MaterialVO SelectMaterial(int idMaterial)
        {
            Material n = (from o in db.Materials
                          where o.ID_MATERIAL.Equals(idMaterial)
                          select o).FirstOrDefault();

            MaterialVO objMatVO = new MaterialVO();

            if (n != null)
            {

                objMatVO.IdMaterial = n.ID_MATERIAL;
                objMatVO.IdTipoMaterial = n.ID_TIPO_MATERIAL;
                objMatVO.Descicao = n.DSC_MATERIAL;
                objMatVO.MinEstoque = n.MIN_ESTOQUE;
                objMatVO.MaxEstoque = n.MAX_ESTOQUE;
                objMatVO.IdFornecedor = n.ID_FORNECEDOR;
                objMatVO.IdUsuario = n.ID_USUARIO;
                objMatVO.IdUnidadeMedida = n.ID_UNIDADE_MEDIDA;
                objMatVO.Observacao = n.OBSERVACAO;
                objMatVO.Utilizado = n.FLG_UTILIZADO;
            }
            return objMatVO;

        }

        /// <summary>
        /// Inativar Material
        /// </summary>
        /// <param name="IdMaterial">int IdMaterial</param>
        public void InativarMaterial(int IdMaterial)
        {
            Material n = (from o in db.Materials
                          where o.ID_MATERIAL.Equals(IdMaterial)
                          select o).FirstOrDefault();


            if (n != null)
            {
                n.FLG_UTILIZADO = true;
                db.Materials.ApplyCurrentValues(n);
                db.SaveChanges();
            }
        }

        /// <summary>
        /// Seleciona uma Lista de Material
        /// </summary>
        /// <param name="ConsultaMaterial">string MaterialVO</param>
        /// <returns>List MaterialVO</returns>
        public List<MaterialVO> SelectMaterial(string ConsultaMaterial)
        {
            List<MaterialVO> ListMatVO = new List<MaterialVO>();

            List<Material> listC = (from o in db.Materials
                                    where o.DSC_MATERIAL.Trim().Contains(ConsultaMaterial.Trim())
                                    || o.Tipo_Material.DSC_TIPO_MATERIAL.Trim().Contains(ConsultaMaterial.Trim())
                                    select o).OrderByDescending(c => c.DAT_CADASTRO).ToList();

            foreach (var item in listC)
            {
                MaterialVO objMatVO = new MaterialVO();
                objMatVO.IdMaterial = item.ID_MATERIAL;
                objMatVO.IdTipoMaterial = item.ID_TIPO_MATERIAL;
                objMatVO.Descicao = item.DSC_MATERIAL;
                objMatVO.MinEstoque = item.MIN_ESTOQUE;
                objMatVO.MaxEstoque = item.MAX_ESTOQUE;
                objMatVO.IdFornecedor = item.ID_FORNECEDOR;
                objMatVO.IdUsuario = item.ID_USUARIO;
                objMatVO.IdUnidadeMedida = item.ID_UNIDADE_MEDIDA;
                objMatVO.Observacao = item.OBSERVACAO;
                objMatVO.Utilizado = item.FLG_UTILIZADO;
                ListMatVO.Add(objMatVO);
            }

            return ListMatVO;
        }
    }
}